{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 心脏病结果分类（SVM）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1.读取数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "diseaseResults = np.loadtxt('data/heart.csv', delimiter=',')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "diseasex = diseaseResults[:, 0:-1]\n",
    "diseasey = diseaseResults[:, -1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((212, 13), (212,), (91, 13), (91,))"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 数据集分割\n",
    "from sklearn.model_selection import train_test_split\n",
    "trainX, testX, trainY, testY = train_test_split(diseasex, diseasey, test_size = 0.3, random_state = 32)\n",
    "trainX.shape, trainY.shape, testX.shape, testY.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 引入模型\n",
    "from sklearn.svm import SVC\n",
    "from sklearn.svm import LinearSVC\n",
    "from sklearn.metrics import accuracy_score\n",
    "from sklearn.metrics import precision_score\n",
    "from sklearn.metrics import recall_score\n",
    "from sklearn.metrics import f1_score"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2.核函数选基于半径的核函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "rbf：C=0.1\n",
      "精度： 0.52 查准率： 0.52 查全率： 1.0 f1： 0.68\n"
     ]
    }
   ],
   "source": [
    "clf_r0=SVC(kernel='rbf',C=0.1)\n",
    "clf_r0.fit(trainX,trainY)\n",
    "prediction=clf_r0.predict(testX)\n",
    "as_disease_r=round(accuracy_score(testY,prediction),2)\n",
    "ps_disease_r=round(precision_score(testY,prediction),2)\n",
    "rs_disease_r=round(recall_score(testY,prediction),2)\n",
    "f1_disease_r=round(f1_score(testY,prediction),2)\n",
    "print('rbf：C=0.1')\n",
    "print('精度：',as_disease_r,'查准率：',ps_disease_r,'查全率：',rs_disease_r,'f1：',f1_disease_r)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "rbf：C=1\n",
      "精度： 0.68 查准率： 0.63 查全率： 0.91 f1： 0.75\n"
     ]
    }
   ],
   "source": [
    "clf_r0=SVC(kernel='rbf',C=1)\n",
    "clf_r0.fit(trainX,trainY)\n",
    "prediction=clf_r0.predict(testX)\n",
    "as_disease_r=round(accuracy_score(testY,prediction),2)\n",
    "ps_disease_r=round(precision_score(testY,prediction),2)\n",
    "rs_disease_r=round(recall_score(testY,prediction),2)\n",
    "f1_disease_r=round(f1_score(testY,prediction),2)\n",
    "print('rbf：C=1')\n",
    "print('精度：',as_disease_r,'查准率：',ps_disease_r,'查全率：',rs_disease_r,'f1：',f1_disease_r)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3.核函数选linear"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "linear：C=0.1\n",
      "精度： 0.67 查准率： 0.61 查全率： 1.0 f1： 0.76\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\anaconda3\\lib\\site-packages\\sklearn\\svm\\_base.py:976: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  warnings.warn(\"Liblinear failed to converge, increase \"\n"
     ]
    }
   ],
   "source": [
    "clf=LinearSVC(C=0.1)\n",
    "clf.fit(trainX,trainY)\n",
    "prediction=clf.predict(testX)\n",
    "as_disease_l=round(accuracy_score(testY,prediction),2)\n",
    "ps_disease_l=round(precision_score(testY,prediction),2)\n",
    "rs_disease_l=round(recall_score(testY,prediction),2)\n",
    "f1_disease_l=round(f1_score(testY,prediction),2)\n",
    "print('linear：C=0.1')\n",
    "print('精度：',as_disease_l,'查准率：',ps_disease_l,'查全率：',rs_disease_l,'f1：',f1_disease_l)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "linear：C=0.7\n",
      "精度： 0.81 查准率： 0.74 查全率： 0.98 f1： 0.84\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\anaconda3\\lib\\site-packages\\sklearn\\svm\\_base.py:976: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  warnings.warn(\"Liblinear failed to converge, increase \"\n"
     ]
    }
   ],
   "source": [
    "clf=LinearSVC(C=0.8)\n",
    "clf.fit(trainX,trainY)\n",
    "prediction=clf.predict(testX)\n",
    "as_disease_l=round(accuracy_score(testY,prediction),2)\n",
    "ps_disease_l=round(precision_score(testY,prediction),2)\n",
    "rs_disease_l=round(recall_score(testY,prediction),2)\n",
    "f1_disease_l=round(f1_score(testY,prediction),2)\n",
    "print('linear：C=0.7')\n",
    "print('精度：',as_disease_l,'查准率：',ps_disease_l,'查全率：',rs_disease_l,'f1：',f1_disease_l)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "linear：C=1\n",
      "精度： 0.55 查准率： 0.53 查全率： 1.0 f1： 0.7\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\anaconda3\\lib\\site-packages\\sklearn\\svm\\_base.py:976: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  warnings.warn(\"Liblinear failed to converge, increase \"\n"
     ]
    }
   ],
   "source": [
    "clf=LinearSVC(C=1)\n",
    "clf.fit(trainX,trainY)\n",
    "prediction=clf.predict(testX)\n",
    "as_spam_l=round(accuracy_score(testY,prediction),2)\n",
    "ps_spam_l=round(precision_score(testY,prediction),2)\n",
    "rs_spam_l=round(recall_score(testY,prediction),2)\n",
    "f1_spam_l=round(f1_score(testY,prediction),2)\n",
    "print('linear：C=1')\n",
    "print('精度：',as_spam_l,'查准率：',ps_spam_l,'查全率：',rs_spam_l,'f1：',f1_spam_l)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4.核函数选sigmoid"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "sigmoid：C=0.1\n",
      "精度： 0.52 查准率： 0.52 查全率： 1.0 f1： 0.68\n",
      "sigmoid：C=1\n",
      "精度： 0.52 查准率： 0.52 查全率： 1.0 f1： 0.68\n"
     ]
    }
   ],
   "source": [
    "clf_s0=SVC(kernel='sigmoid',C=0.1)\n",
    "clf_s0.fit(trainX,trainY)\n",
    "prediction=clf_s0.predict(testX)\n",
    "as_spam_s=round(accuracy_score(testY,prediction),2)\n",
    "ps_spam_s=round(precision_score(testY,prediction),2)\n",
    "rs_spam_s=round(recall_score(testY,prediction),2)\n",
    "f1_spam_s=round(f1_score(testY,prediction),2)\n",
    "print('sigmoid：C=0.1')\n",
    "print('精度：',as_spam_s,'查准率：',ps_spam_s,'查全率：',rs_spam_s,'f1：',f1_spam_s)\n",
    "\n",
    "clf_s1=SVC(kernel='sigmoid',C=1)\n",
    "clf_s1.fit(trainX,trainY)\n",
    "prediction=clf_s1.predict(testX)\n",
    "as_spam_s=round(accuracy_score(testY,prediction),2)\n",
    "ps_spam_s=round(precision_score(testY,prediction),2)\n",
    "rs_spam_s=round(recall_score(testY,prediction),2)\n",
    "f1_spam_s=round(f1_score(testY,prediction),2)\n",
    "print('sigmoid：C=1')\n",
    "print('精度：',as_spam_s,'查准率：',ps_spam_s,'查全率：',rs_spam_s,'f1：',f1_spam_s)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## heart disease分类任务\n",
    "\n",
    "\n",
    "核函数 | C | 精度 | 查准率 | 查全率 | F1\n",
    "- | - | - | - | - | -\n",
    "rbf | 0.1 | 0.52 | 0.52 | 0.1 | 0.68\n",
    "rbf | 1 | 0.68 | 0.63 | 0.91 | 0.75\n",
    "linear | 0.1 | 0.67 | 0.61 | 1.0 | 0.76\n",
    "linear | 0.7 | 0.81 | 0.74 | 0.98 | 0.84\n",
    "linear | 1 | 0.55 | 0.53 | 1.0 | 0.7\n",
    "sigmoid | 0.1 | 0.52 | 0.52 | 1.0 | 0.68\n",
    "sigmoid | 1 | 0.52 | 0.52 | 1.0 | 0.68"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 5.参数可视化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\anaconda3\\lib\\site-packages\\sklearn\\svm\\_base.py:976: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  warnings.warn(\"Liblinear failed to converge, increase \"\n",
      "D:\\anaconda3\\lib\\site-packages\\sklearn\\svm\\_base.py:976: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  warnings.warn(\"Liblinear failed to converge, increase \"\n",
      "D:\\anaconda3\\lib\\site-packages\\sklearn\\svm\\_base.py:976: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  warnings.warn(\"Liblinear failed to converge, increase \"\n",
      "D:\\anaconda3\\lib\\site-packages\\sklearn\\svm\\_base.py:976: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  warnings.warn(\"Liblinear failed to converge, increase \"\n",
      "D:\\anaconda3\\lib\\site-packages\\sklearn\\svm\\_base.py:976: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  warnings.warn(\"Liblinear failed to converge, increase \"\n",
      "D:\\anaconda3\\lib\\site-packages\\sklearn\\svm\\_base.py:976: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  warnings.warn(\"Liblinear failed to converge, increase \"\n",
      "D:\\anaconda3\\lib\\site-packages\\sklearn\\svm\\_base.py:976: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  warnings.warn(\"Liblinear failed to converge, increase \"\n",
      "D:\\anaconda3\\lib\\site-packages\\sklearn\\svm\\_base.py:976: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  warnings.warn(\"Liblinear failed to converge, increase \"\n",
      "D:\\anaconda3\\lib\\site-packages\\sklearn\\svm\\_base.py:976: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  warnings.warn(\"Liblinear failed to converge, increase \"\n",
      "D:\\anaconda3\\lib\\site-packages\\sklearn\\svm\\_base.py:976: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  warnings.warn(\"Liblinear failed to converge, increase \"\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "Text(0, 0.5, 'accuracy_score')"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "# YOUR CODE HERE\n",
    "y = []\n",
    "\n",
    "for i in range(10):\n",
    "    m = 0.1 * (i + 1)\n",
    "    clf=LinearSVC(C = m)\n",
    "    clf.fit(trainX,trainY)\n",
    "    prediction=clf.predict(testX)\n",
    "    y.append(prediction)\n",
    "    \n",
    "x = np.linspace(0.1,1,10)\n",
    "test = [accuracy_score(testY, val) for val in y]\n",
    "\n",
    "plt.figure()\n",
    "plt.plot(x,test,'-')\n",
    "plt.title(\"SVM's accuracy_score changes with the C\")\n",
    "plt.xlabel(\"C\")    \n",
    "plt.ylabel(\"accuracy_score\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
